<!DOCTYPE html>
<!-- saved from url=(0127)https://docs.google.com/document/d/e/2PACX-1vT1z9Wz-eIIiBXAnE7HleHd0x9_tIZSV5_69fE-CqK56iaVhBzn9UUuOa6Zb42IvUzE5l-8fZPcmfF2/pub -->
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>WebPerfWG call - March 4th 2021</title><link rel="shortcut icon" href="https://ssl.gstatic.com/docs/documents/images/kix-favicon7.ico"><meta name="referrer" content="strict-origin-when-cross-origin"><style type="text/css" nonce="">
      @import url("https://fonts.googleapis.com/css?family=Google+Sans");
      @import url("https://fonts.googleapis.com/css?family=Roboto");

      body {
        font-family: Roboto, arial, sans, sans-serif;
        margin: 0;
      }

      iframe {
        border: 0;
        frameborder: 0;
        height: 100%;
        width: 100%;
      }

      #header {
        align-items: center;
        background: white;
        border-bottom: 1px #ccc solid;
        display: flex;
        height: 60px;
        justify-content: space-between;
        position: fixed;
        top: 0;
        width: 100%;
        z-index: 100;
      }

      #header #title {
        font-family: 'Google Sans';
        font-size: large;
        margin: auto 0 auto 20px;
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
        width: 70%;
      }

      #header #interval {
        margin: auto 25px auto 0;
        font-family: Roboto;
        font-size: small;;
      }

      #footer {
        background: #f0f0f0;
        border-bottom: 1px #ccc solid;
        bottom: 0;
        font-family: Roboto;
        font-size: small;
        padding: 10px 10px;
        position: fixed;
        text-align: center;
        width: 100%;
      }

      #contents {
        padding: 100px 20% 50px 20%;
      }

      @media only screen and (max-device-width: 800px) {
        #header {
          border-bottom-width: 5px;
          height: auto;
          display: block;
        }

        #header #title {
          font-size: 3em;
          margin: auto 0 auto 20px;
          width: 90%;
        }

        #header #interval {
          font-size: 1.5em;
          margin: 10px 0 auto 25px;
        }

        #contents {
          padding: 150px 5% 80px;
        }

        #footer {
          font-size: 2em;
        }
      }

      .dash {
        padding: 0 6px;
      }
    </style></head><body><div id="header"><div id="title">WebPerfWG call - March 4th 2021</div><div id="interval"><span></span></div></div><div id="contents"><style type="text/css">.lst-kix_y7und390ribs-0>li:before{content:"\0025cf  "}ul.lst-kix_y7und390ribs-8{list-style-type:none}ul.lst-kix_y7und390ribs-7{list-style-type:none}ul.lst-kix_y7und390ribs-6{list-style-type:none}ul.lst-kix_y7und390ribs-5{list-style-type:none}ul.lst-kix_y7und390ribs-4{list-style-type:none}ul.lst-kix_y7und390ribs-3{list-style-type:none}ul.lst-kix_y7und390ribs-2{list-style-type:none}ul.lst-kix_y7und390ribs-1{list-style-type:none}.lst-kix_y7und390ribs-2>li:before{content:"\0025a0  "}ul.lst-kix_y7und390ribs-0{list-style-type:none}.lst-kix_y7und390ribs-1>li:before{content:"\0025cb  "}.lst-kix_tt8ilkrlg727-4>li:before{content:"\0025cb  "}.lst-kix_tt8ilkrlg727-3>li:before{content:"\0025cf  "}.lst-kix_tt8ilkrlg727-5>li:before{content:"\0025a0  "}.lst-kix_tt8ilkrlg727-0>li:before{content:"\0025cf  "}.lst-kix_tt8ilkrlg727-8>li:before{content:"\0025a0  "}.lst-kix_tt8ilkrlg727-7>li:before{content:"\0025cb  "}.lst-kix_tt8ilkrlg727-6>li:before{content:"\0025cf  "}.lst-kix_y7und390ribs-8>li:before{content:"\0025a0  "}.lst-kix_y7und390ribs-6>li:before{content:"\0025cf  "}.lst-kix_y7und390ribs-7>li:before{content:"\0025cb  "}.lst-kix_y7und390ribs-3>li:before{content:"\0025cf  "}.lst-kix_y7und390ribs-4>li:before{content:"\0025cb  "}.lst-kix_tt8ilkrlg727-1>li:before{content:"\0025cb  "}.lst-kix_x7ut0dnp6e0r-8>li:before{content:"\0025a0  "}.lst-kix_y7und390ribs-5>li:before{content:"\0025a0  "}.lst-kix_tt8ilkrlg727-2>li:before{content:"\0025a0  "}.lst-kix_x7ut0dnp6e0r-7>li:before{content:"\0025cb  "}.lst-kix_lztyypn34wrq-2>li:before{content:"\0025a0  "}.lst-kix_lztyypn34wrq-4>li:before{content:"\0025cb  "}.lst-kix_lztyypn34wrq-3>li:before{content:"\0025cf  "}.lst-kix_lztyypn34wrq-7>li:before{content:"\0025cb  "}.lst-kix_lztyypn34wrq-6>li:before{content:"\0025cf  "}.lst-kix_lztyypn34wrq-5>li:before{content:"\0025a0  "}.lst-kix_lztyypn34wrq-8>li:before{content:"\0025a0  "}ul.lst-kix_9xy3hbhi7q1r-1{list-style-type:none}ul.lst-kix_9xy3hbhi7q1r-0{list-style-type:none}ul.lst-kix_9xy3hbhi7q1r-8{list-style-type:none}ul.lst-kix_9xy3hbhi7q1r-7{list-style-type:none}.lst-kix_lztyypn34wrq-0>li:before{content:"\0025cf  "}ul.lst-kix_9xy3hbhi7q1r-6{list-style-type:none}ul.lst-kix_9xy3hbhi7q1r-5{list-style-type:none}ul.lst-kix_9xy3hbhi7q1r-4{list-style-type:none}ul.lst-kix_9xy3hbhi7q1r-3{list-style-type:none}.lst-kix_lztyypn34wrq-1>li:before{content:"\0025cb  "}ul.lst-kix_9xy3hbhi7q1r-2{list-style-type:none}ul.lst-kix_lztyypn34wrq-8{list-style-type:none}ul.lst-kix_lztyypn34wrq-6{list-style-type:none}ul.lst-kix_lztyypn34wrq-7{list-style-type:none}ul.lst-kix_lztyypn34wrq-4{list-style-type:none}ul.lst-kix_lztyypn34wrq-5{list-style-type:none}ul.lst-kix_lztyypn34wrq-2{list-style-type:none}ul.lst-kix_lztyypn34wrq-3{list-style-type:none}ul.lst-kix_lztyypn34wrq-0{list-style-type:none}ul.lst-kix_lztyypn34wrq-1{list-style-type:none}ul.lst-kix_x7ut0dnp6e0r-3{list-style-type:none}ul.lst-kix_x7ut0dnp6e0r-2{list-style-type:none}ul.lst-kix_x7ut0dnp6e0r-1{list-style-type:none}ul.lst-kix_x7ut0dnp6e0r-0{list-style-type:none}ul.lst-kix_x7ut0dnp6e0r-8{list-style-type:none}ul.lst-kix_x7ut0dnp6e0r-7{list-style-type:none}ul.lst-kix_x7ut0dnp6e0r-6{list-style-type:none}ul.lst-kix_x7ut0dnp6e0r-5{list-style-type:none}ul.lst-kix_x7ut0dnp6e0r-4{list-style-type:none}ul.lst-kix_tt8ilkrlg727-8{list-style-type:none}ul.lst-kix_tt8ilkrlg727-7{list-style-type:none}.lst-kix_p7lg6h87chup-2>li:before{content:"\0025a0  "}ul.lst-kix_tt8ilkrlg727-6{list-style-type:none}ul.lst-kix_tt8ilkrlg727-5{list-style-type:none}ul.lst-kix_tt8ilkrlg727-4{list-style-type:none}.lst-kix_p7lg6h87chup-1>li:before{content:"\0025cb  "}ul.lst-kix_tt8ilkrlg727-3{list-style-type:none}.lst-kix_p7lg6h87chup-5>li:before{content:"\0025a0  "}ul.lst-kix_tt8ilkrlg727-2{list-style-type:none}.lst-kix_p7lg6h87chup-4>li:before{content:"\0025cb  "}.lst-kix_p7lg6h87chup-3>li:before{content:"\0025cf  "}.lst-kix_p7lg6h87chup-8>li:before{content:"\0025a0  "}.lst-kix_p7lg6h87chup-6>li:before{content:"\0025cf  "}.lst-kix_p7lg6h87chup-7>li:before{content:"\0025cb  "}.lst-kix_9xy3hbhi7q1r-3>li:before{content:"\0025cf  "}.lst-kix_x7ut0dnp6e0r-4>li:before{content:"\0025cb  "}.lst-kix_x7ut0dnp6e0r-2>li:before{content:"\0025a0  "}.lst-kix_x7ut0dnp6e0r-6>li:before{content:"\0025cf  "}.lst-kix_9xy3hbhi7q1r-0>li:before{content:"\0025cf  "}.lst-kix_9xy3hbhi7q1r-4>li:before{content:"\0025cb  "}.lst-kix_x7ut0dnp6e0r-1>li:before{content:"\0025cb  "}.lst-kix_x7ut0dnp6e0r-5>li:before{content:"\0025a0  "}.lst-kix_9xy3hbhi7q1r-7>li:before{content:"\0025cb  "}.lst-kix_9xy3hbhi7q1r-5>li:before{content:"\0025a0  "}.lst-kix_9xy3hbhi7q1r-6>li:before{content:"\0025cf  "}.lst-kix_x7ut0dnp6e0r-3>li:before{content:"\0025cf  "}ul.lst-kix_p7lg6h87chup-6{list-style-type:none}ul.lst-kix_p7lg6h87chup-7{list-style-type:none}ul.lst-kix_p7lg6h87chup-8{list-style-type:none}.lst-kix_9xy3hbhi7q1r-8>li:before{content:"\0025a0  "}.lst-kix_x7ut0dnp6e0r-0>li:before{content:"\0025cf  "}ul.lst-kix_tt8ilkrlg727-1{list-style-type:none}ul.lst-kix_tt8ilkrlg727-0{list-style-type:none}ul.lst-kix_p7lg6h87chup-0{list-style-type:none}ul.lst-kix_p7lg6h87chup-1{list-style-type:none}.lst-kix_p7lg6h87chup-0>li:before{content:"\0025cf  "}ul.lst-kix_p7lg6h87chup-2{list-style-type:none}ul.lst-kix_p7lg6h87chup-3{list-style-type:none}ul.lst-kix_p7lg6h87chup-4{list-style-type:none}ul.lst-kix_p7lg6h87chup-5{list-style-type:none}li.li-bullet-0:before{margin-left:-18pt;white-space:nowrap;display:inline-block;min-width:18pt}.lst-kix_9xy3hbhi7q1r-1>li:before{content:"\0025cb  "}.lst-kix_9xy3hbhi7q1r-2>li:before{content:"\0025a0  "}ol{margin:0;padding:0}table td,table th{padding:0}.c2{margin-left:36pt;padding-top:0pt;padding-left:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c4{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:16pt;font-family:"Arial";font-style:normal}.c8{padding-top:20pt;padding-bottom:6pt;line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.c0{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:"Arial";font-style:normal}.c1{padding-top:18pt;padding-bottom:6pt;line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.c10{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:20pt;font-family:"Arial";font-style:normal}.c5{padding-top:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c6{text-decoration-skip-ink:none;-webkit-text-decoration-skip:none;color:#1155cc;text-decoration:underline}.c11{background-color:#ffffff;max-width:468pt;padding:72pt 72pt 72pt 72pt}.c9{padding:0;margin:0}.c7{color:inherit;text-decoration:inherit}.c3{font-weight:700}.title{padding-top:0pt;color:#000000;font-size:26pt;padding-bottom:3pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.subtitle{padding-top:0pt;color:#666666;font-size:15pt;padding-bottom:16pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}li{color:#000000;font-size:11pt;font-family:"Arial"}p{margin:0;color:#000000;font-size:11pt;font-family:"Arial"}h1{padding-top:20pt;color:#000000;font-size:20pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h2{padding-top:18pt;color:#000000;font-size:16pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h3{padding-top:16pt;color:#434343;font-size:14pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h4{padding-top:14pt;color:#666666;font-size:12pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h5{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h6{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;font-style:italic;orphans:2;widows:2;text-align:left}</style><div class="c11"><h1 class="c8" id="h.ygh3mmf9o26x"><span class="c10">Participants</span></h1><p class="c5"><span class="c0">Nic Jansma, Yoav Weiss, Noam Helfman, Giacomo Zecchini, Noam Rosenthal, Patrick Meenan, Michal Mocny, Peter Perlepes, Michelle Vu, Sean Feng, Gilles Dubuc, Nicol&aacute;s Pe&ntilde;a Moreno, Benjamin De Kosnik, Annie Sullivan</span></p><h1 class="c8" id="h.902aatlcbl59"><span class="c10">Next Meeting</span></h1><p class="c5"><span class="c0">March 18 @ 10am PST / 1pm EST</span></p><h1 class="c8" id="h.7f33ujq0wb4b"><span class="c10">Topics</span></h1><h2 class="c1" id="h.mkrmw1apdf7v"><span class="c4">Resource Timing Fetch integration - Noam Rosenthal</span></h2><ul class="c9 lst-kix_9xy3hbhi7q1r-0 start"><li class="c2 li-bullet-0"><span class="c3">Noam R</span><span class="c0"><b></b>: Up until now, ResourceTiming specifies at which points during network request response the measurements will take place</span></li><li class="c2 li-bullet-0"><span class="c0">… Creates parallel algorithm to what already exists in Fetch</span></li><li class="c2 li-bullet-0"><span class="c0">… What we’re trying to do is define in Fetch when metrics should be taken</span></li><li class="c2 li-bullet-0"><span class="c0">… In some cases this might be vague or open to interpretation</span></li><li class="c2 li-bullet-0"><span class="c0">… Trying to make this more precise</span></li><li class="c2 li-bullet-0"><span class="c0">… Also some timestamps in HTTP (TLS, DNS, etc)</span></li><li class="c2 li-bullet-0"><span class="c0">… Having Fetch gather the metrics and pass to ResourceTiming to normalize before it’s exposed to web developers</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Yoav</b>: A lot of the processing model and the somewhat conflicting “getting” algorithms will mote to a structure in Fetch that contains that information, and will report that info to ResourceTiming spec</span></li><li class="c2 li-bullet-0"><span class="c0">… Design that’s much closer to how implementations currently do that (at least for Chromium and Webkit)</span></li><li class="c2 li-bullet-0"><span class="c0">… Good way to make spec closer to what implementations do</span></li><li class="c2 li-bullet-0"><span class="c0">… In the process, there’s scrutiny around what they’re exposing. Hoping to find ourselves with all the attributes well-defined regarding what they expose. </span></li><li class="c2 li-bullet-0"><span><b>Nic</b>: NavigationTiming</span><span class="c0">&nbsp;is built on top of Resource Timing. Are we planning to also tackle that? Or is that phase 2?</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Noam R</b>: That will be in Phase 2. We’re starting with Resource Timing. A lot of the infrastructure would be similar.</span></li><li class="c2 li-bullet-0"><span><b>Nic</b>: Is the goal to try to maintain compatibility</span><span class="c0">&nbsp;to how we report timing today? Will there be browsers closer to the Fetch-based version than others?</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Noam R</b>: I think it will be somewhere in the middle. &nbsp;We want the timestamps to be well defined, to avoid interoperability issues, and we want WPTs to reflect that.</span></li><li class="c2 li-bullet-0"><span class="c0">… If there are parts in implementation that can be reverse-engineered to be well-defined, that would be pretty close. In other cases, it might be better to change implementations.</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Yoav</b>: We can definitely not break content, but in terms of timing there are MAYs or things open to interpretation, that we’d want to clamp down.</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Nic</b>: There’s already divergence in implementations. If there’s anything we need to redefine, I just want us to be transparent about that, e.g. for older browsers vs. future browsers.</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Noam R</b>: A lot of things so far are around Timing Allow Origin, and what is exposed. &nbsp;Or under-defined things like workerStart</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Yoav</b>: workerStart will be discussed soon, as well as nextHopProtocol should be TAO protected</span></li></ul><h2 class="c1" id="h.k2aykc5nlqsg"><span class="c6"><a class="c7" href="https://www.google.com/url?q=https://github.com/w3c/navigation-timing/issues/128&amp;sa=D&amp;source=editors&amp;ust=1615294075256000&amp;usg=AOvVaw1gJe_Xa_p7zRvCrMLP2XvE">worker start needs to be added to diagram · Issue #128 · w3c/navigation-timing</a></span><span>&nbsp;- </span><span class="c6"><a class="c7" href="https://www.google.com/url?q=https://docs.google.com/presentation/d/1r3FwT1UTo7lpjZvYe-YV7cNAee8co-qCxIU5SdERalQ/edit?usp%3Dsharing&amp;sa=D&amp;source=editors&amp;ust=1615294075256000&amp;usg=AOvVaw3d_LM3JDkoFoSH3P0Qh1ff">slides</a></span></h2><ul class="c9 lst-kix_tt8ilkrlg727-0 start"><li class="c2 li-bullet-0"><span class="c0"><b>Nic</b>: relevant for both NavTiming and ResourceTiming</span></li><li class="c2 li-bullet-0"><span class="c0">… Nebulous term capturing when a SW was started</span></li><li class="c2 li-bullet-0"><span class="c0">… Was meant to measure the costs of starting up a SW</span></li><li class="c2 li-bullet-0"><span class="c0">… Added to the spec in 2015. Implemented only in Chrome, attribute exists elsewhere but always 0</span></li><li class="c2 li-bullet-0"><span class="c0">… In Chrome it’s always less than or equal fetchStart</span></li><li class="c2 li-bullet-0"><span class="c0">… kinda happens ahead of redirects</span></li><li class="c2 li-bullet-0"><span class="c0">… It’s kinda confusing what it means and what we intend to do with it</span></li><li class="c2 li-bullet-0"><span class="c0">… It’s missing from the diagram and there’s an open issue on that</span></li><li class="c2 li-bullet-0"><span class="c0">… I started looking into where it should fit and there are a bunch of edge cases where if it would be implemented as specced it would be not what we want</span></li><li class="c2 li-bullet-0"><span class="c0">… For example, if you have same origin redirects =&gt; workerStart will always 0</span></li><li class="c2 li-bullet-0"><span class="c0">… If we didn’t do that, workerStart would always be for the last document</span></li><li class="c2 li-bullet-0"><span class="c0">… Cross-origin redirects result in time for the cross-origin document and not the final document, and that information we want to avoid</span></li><li class="c2 li-bullet-0"><span class="c0">… Also same origin means is different when there are no redirects</span></li><li class="c2 li-bullet-0"><span class="c0">… There are also some questions on when workerStart should be in the diagram - before fetchStart or after it?</span></li><li class="c2 li-bullet-0"><span class="c0">… fetchStart is after all the redirects but before AppCache</span></li><li class="c2 li-bullet-0"><span class="c0">… workerStart happens before that, before the redirects - when the worker had to start up</span></li><li class="c2 li-bullet-0"><span class="c0">… But according to the definition, it’s actually the opposite. So some definitions indicate that it should be after fetchStart. </span></li><li class="c2 li-bullet-0"><span class="c0">… General consensus about it happening before fetchStart, but inconsistent today.</span></li><li class="c2 li-bullet-0"><span class="c0">… The original goal: how do I measure how long it took for the sync service worker to start up?</span></li><li class="c2 li-bullet-0"><span class="c0">… Original PR describes fetchStart-workerStart gives you SW start time &nbsp;(at least in mPulse)</span></li><li class="c2 li-bullet-0"><span class="c0">… You can’t actually use it that way if there are any redirects, so that would also include redirect time</span></li><li class="c2 li-bullet-0"><span class="c0">… There are also SW scopes, so you could have multiple SW starting if you have redirects between different paths on your origin</span></li><li class="c2 li-bullet-0"><span class="c0">… So there’s a proposal to change this to have a “worker ready” timestamp, so you can definitely say how long startup took</span></li><li class="c2 li-bullet-0"><span class="c0">… Could be confusing if you have multiple scopes</span></li><li class="c2 li-bullet-0"><span class="c0">… Not using the same words as Resource Timing, so maybe should work closer with Noam</span></li><li class="c2 li-bullet-0"><span class="c0">… There’s also very little test coverage</span></li><li class="c2 li-bullet-0"><span class="c0">… Definitely want to lock it once we make changes</span></li><li class="c2 li-bullet-0"><span class="c0">… Today it would be hard for Mozilla or Safari to implement because of that</span></li><li class="c2 li-bullet-0"><span>…</span><span style="overflow: hidden;<b> display</b>: inline-block;<b> margin</b>: 0.00px 0.00px;<b> border</b>: 0.00px solid #000000;<b> transform</b>: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);<b> width</b>: 624.00px;<b> height</b>: 352.00px;"><img alt="" src="./WebPerfWG call - March 4th 2021_files/Screen Shot 2021-03-09 at 11.41.38.png" style="width: 624.00px;<b> height</b>: 352.00px; margin-left: 0.00px; margin-top: 0.00px;<b> transform</b>: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title=""></span></li><li class="c2 li-bullet-0"><span class="c0">… Some of the cases are addressed as well</span></li><li class="c2 li-bullet-0"><span class="c0">… But still some other cases that are not yet addressed</span></li><li class="c2 li-bullet-0"><span class="c0">… Would make sense to integrate all that with Noam’s work on Fetch integration</span></li><li class="c2 li-bullet-0"><span>… </span><span style="overflow: hidden;<b> display</b>: inline-block;<b> margin</b>: 0.00px 0.00px;<b> border</b>: 0.00px solid #000000;<b> transform</b>: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);<b> width</b>: 624.00px;<b> height</b>: 285.33px;"><img alt="" src="./WebPerfWG call - March 4th 2021_files/Screen Shot 2021-03-09 at 11.42.24.png" style="width: 624.00px;<b> height</b>: 285.33px; margin-left: 0.00px; margin-top: 0.00px;<b> transform</b>: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title=""></span></li><li class="c2 li-bullet-0"><span class="c0">… Wanted to bring everyone up to speed and see if we need to merge it </span></li><li class="c2 li-bullet-0"><span class="c0"><b>Noam R</b>: Something that came up while you were talking about redirects. Everything in Resource Timing has a 1-1 mapping with the request. But here you want to count multiple times the worker starts</span></li><li class="c2 li-bullet-0"><span class="c0">… I wonder if it should be a separate entry. Maybe the worker start is not part of the request in a way</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Nic</b>: If all we want to answer is SW start time, maybe we can expose that directly.</span></li><li class="c2 li-bullet-0"><span class="c0">… In RT we collapse redirect reporting. You could have SW start at different points in time. So maybe it makes more sense to have a workerStartupTotalTime</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Noam R</b>: yeah, otherwise you’re counting time for redirects</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Benjamin</b>: So great to see this effort. Mozilla just started looking into and Service Worker profiling. We start it after fetchStart. We have this thing called FetchEvent, synthsizes response and the beginning of AppCache. </span></li><li class="c2 li-bullet-0"><span class="c0">… Really like the bracketing approach, but there can be different things. Taking what Noam says to heart, and wondering if we need a more fine-grained approach.</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Nic</b>: Confusion today on where workerStart falls depends on your definition of fetchStart. </span></li><li class="c2 li-bullet-0"><span class="c0">… In some cases it’s the entry point to the Fetch spec, and then workerStart is after fetchStart. In Resource Timing fetchStart is more at a later point.</span></li><li class="c2 li-bullet-0"><span class="c0">… Reporting total worker startup time would get around those issues as well.</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Noam R</b>: It makes sense that when there are things that are not 1-1 with requests, we have new entries for them. If we have 3 workers, why not have an entry for each one? </span></li><li class="c2 li-bullet-0"><span class="c0">… Trying to aggregate them into an existing entry makes it complex.</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Nic</b>: Would help with debugging if one of many was slower than others, you can figure it out</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Noam R</b>: Can imagine doing this with dedicated workers as well</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Nic</b>: and similarly, same-origin redirects could use the same breakdown</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Yoav</b>: We’ve had an open issue about that for same-origin redirects. Could be interesting to think about this as a separate problem.</span></li><li class="c2 li-bullet-0"><span class="c0">… Thought of inviting folks from the Service Workers WG and have a joint meeting.</span></li><li class="c2 li-bullet-0"><span>&lt;administrative talk about scheduling&gt;</span></li></ul><h2 class="c1" id="h.3jv6yy55gx6w"><span class="c6"><a class="c7" href="https://www.google.com/url?q=https://github.com/w3c/hr-time/issues/105&amp;sa=D&amp;source=editors&amp;ust=1615294075262000&amp;usg=AOvVaw30ikkjTeD-X4OPqulaFA6V">`timeOrigin` is not clamped · Issue #105 · w3c/hr-time</a></span><span>&nbsp;&amp; </span><span class="c6"><a class="c7" href="https://www.google.com/url?q=https://github.com/w3c/hr-time/pull/106/&amp;sa=D&amp;source=editors&amp;ust=1615294075262000&amp;usg=AOvVaw1opaIgJY75ICdHJAXW_b8_">PR#106</a></span></h2><ul class="c9 lst-kix_p7lg6h87chup-0 start"><li class="c2 li-bullet-0"><span class="c0"><b>Yoav</b>: timeOrigin is not clamped and is exposing the raw time</span></li><li class="c2 li-bullet-0"><span class="c0">… No particular vulnerability we found with this, but no use-case either, so seemed healthier to just clamp it</span></li><li class="c2 li-bullet-0"><span class="c0">… PR 106</span></li><li class="c2 li-bullet-0"><span>… If any objections, please chime in on issue</span></li></ul><h2 class="c1" id="h.pftlbu3au1tv"><span class="c6"><a class="c7" href="https://www.google.com/url?q=https://github.com/w3c/resource-timing/pull/224&amp;sa=D&amp;source=editors&amp;ust=1615294075263000&amp;usg=AOvVaw0O4CVIOVB2W7_sCBt0Yhn6">Make nextHopProtocol TAO protected</a></span><span class="c4">&nbsp;</span></h2><ul class="c9 lst-kix_lztyypn34wrq-0 start"><li class="c2 li-bullet-0"><span class="c0"><b>Yoav</b>: Better to make it TAO protected</span></li><li class="c2 li-bullet-0"><span class="c0">… Some issues if we don’t, seems safer to</span></li><li class="c2 li-bullet-0"><span class="c0">… If objections, please chime in on issue</span></li></ul><h2 class="c1" id="h.aoow3abqrkr7"><span>Event Timing and Scroll Timing - Nicolás - </span><span class="c6"><a class="c7" href="https://www.google.com/url?q=https://docs.google.com/presentation/d/1qVdMlqgi9uuyx9imCauzMjLGHQK6TGOIZV_RnlGBKis&amp;sa=D&amp;source=editors&amp;ust=1615294075264000&amp;usg=AOvVaw0sy_i6c_XmnjarxUuigCOV">slides</a></span></h2><ul class="c9 lst-kix_y7und390ribs-0 start"><li class="c2 li-bullet-0"><span class="c0"><b>Nicol&aacute;s</b>: Wanted to talk about how we’re thinking of improving responsiveness metrics</span></li><li class="c2 li-bullet-0"><span class="c0">… FID brief recap - delta between event timestamp and the time that event handlers for it begin running.</span></li><li class="c2 li-bullet-0"><span class="c0">… Some successes: encourage people to break up their long tasks</span></li><li class="c2 li-bullet-0"><span class="c0">… Tap delay issue surfaced</span></li><li class="c2 li-bullet-0"><span class="c0">… A lot of sites have this issue (some sites have fixed using mobile viewports)</span></li><li class="c2 li-bullet-0"><span class="c0">… Chrome is planning on getting rid of the delay for some of the existing cases</span></li><li class="c2 li-bullet-0"><span class="c0">… Want to improve FID: aware of its limitations</span></li><li class="c2 li-bullet-0"><span class="c0">… Consider more than just first input</span></li><li class="c2 li-bullet-0"><span class="c0">… Potentially include scroll begin</span></li><li class="c2 li-bullet-0"><span class="c0">… Evaluate a large chunk of end-to-end latency</span></li><li class="c2 li-bullet-0"><span class="c0">… For evaluating more than just the first, multiple associated events</span></li><li class="c2 li-bullet-0"><span class="c0">… Keyboard up/down</span></li><li class="c2 li-bullet-0"><span class="c0">… Taps or drags with pointer/touch/mouse/[start|end|up|down] + click</span></li><li class="c2 li-bullet-0"><span class="c0">… For tap interaction, what is the tap latency</span></li><li class="c2 li-bullet-0"><span class="c0">… For drag, just the drag start/end of the interaction. &nbsp;Harder to think about if they’re moving the content, so just the initial drag.</span></li><li class="c2 li-bullet-0"><span class="c0">… Scrolls are not necessarily blocked on any event, so they’re a little more complicated. &nbsp;At least on Chrome, you need to have non-passive listeners to block scrolling on events.</span></li><li class="c2 li-bullet-0"><span class="c0">… Measure the initial scroll latency, not the event listeners triggered by the user-gesture that caused the scroll</span></li><li class="c2 li-bullet-0"><span class="c0">… Need to associate events to interactions (keydown-keyup). &nbsp;Need to allow developers to do this if possible.</span></li><li class="c2 li-bullet-0"><span class="c0">… interactionID so keydown/keyup would have a shared ID</span></li><li class="c2 li-bullet-0"><span class="c0">… The other problem is there is no way to measure scroll performance. Can measure with event handlers but that will introduce latency.</span></li><li class="c2 li-bullet-0"><span class="c0">… The idea is that scrolling is not blocked on event handlers, so impossible to measure this accurately now</span></li><li class="c2 li-bullet-0"><span class="c0">… One use case is that developers can force scrolling to happen in the slow path, and when that happens, they should be made aware of it, and that’s likely to be slower</span></li><li class="c2 li-bullet-0"><span class="c0">… Need a way to measure initial scroll interaction (scroll begin -- latency between touch move that triggers scroll to the time when the browser first reacts to that scroll - paint)</span></li><li class="c2 li-bullet-0"><span class="c0">There can also be use cases for subsequent scroll reactions - for long scrolls operations, subsequent ones are called scroll updates. My initial reaction is that yhey would be better addressed by the Frame Timing API, as they represent frame latency.</span></li><li class="c2 li-bullet-0"><span class="c0">… Two ideas how we could expose this</span></li><li class="c2 li-bullet-0"><span class="c0">… One - Extend PerformanceEventTiming with new entry, even if it doesn’t have an associated event like the other entries do, name=”scrollBegin”</span></li><li class="c2 li-bullet-0"><span class="c0">… Two - a new PerformanceScrollTiming entry, since some of the PerformanceEventTiming attributes are not meaningful for this (processingEnd, etc)</span></li><li class="c2 li-bullet-0"><span class="c0">… Happy to hear folks’ ideas on that front</span></li><li class="c2 li-bullet-0"><span class="c0">… Evaluating end-to-end latency of an interaction</span></li><li class="c2 li-bullet-0"><span style="overflow: hidden;<b> display</b>: inline-block;<b> margin</b>: 0.00px 0.00px;<b> border</b>: 0.00px solid #000000;<b> transform</b>: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);<b> width</b>: 624.00px;<b> height</b>: 350.67px;"><img alt="" src="./WebPerfWG call - March 4th 2021_files/Screen Shot 2021-03-04 at 19.51.16.png" style="width: 624.00px;<b> height</b>: 350.67px; margin-left: 0.00px; margin-top: 0.00px;<b> transform</b>: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);" title=""></span></li><li class="c2 li-bullet-0"><span class="c0">… Starts with input event timestamp from user hardware</span></li><li class="c2 li-bullet-0"><span class="c0">… Then there may be some blocking tasks already in queue to run</span></li><li class="c2 li-bullet-0"><span class="c0">… Next is processing time of event handlers</span></li><li class="c2 li-bullet-0"><span class="c0">… A frame may be presented on the screen</span></li><li class="c2 li-bullet-0"><span class="c0">… After is work kicked off by event handlers (async)</span></li><li class="c2 li-bullet-0"><span class="c0">… The final frame is presented on the screen</span></li><li class="c2 li-bullet-0"><span class="c0">… For the current EventTiming, we measure the first yellow star (.duration value)</span></li><li class="c2 li-bullet-0"><span class="c0">… Async work is hard to track</span></li><li class="c2 li-bullet-0"><span class="c0">… We can improve over FID by looking at next frame presented on screen</span></li><li class="c2 li-bullet-0"><span class="c0">… In future we’d like to explore looking at what those red tasks should be</span></li><li class="c2 li-bullet-0"><span class="c0">… But ATM mostly thinking of exposing the first yellow start (first frame presented on screen), which is currently exposed in Event Timing with duration.</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Noam H</b>: Comment on scroll - main idea makes sense because it fits nicely with existing frameworks that use event name for tracking EventTiming. &nbsp;OK that it doesn’t map to a specific dom event.</span></li><li class="c2 li-bullet-0"><span class="c0">… On the other hand it’d be fine to have more elaborate Scroll Timing information</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Yoav</b>: Do we see if there are cases where we’d have Scroll specific data? Would the data diverge from Events, and have Scroll/Event specific attributes? If so, would be better to start with separate entries.</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Noam H</b>: If they diverge we could keep both entries</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Yoav</b>: We could, but having that as a duplicate won’t be ideal.</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Nicol&aacute;s</b>: May make sense to separate the entries.</span></li><li class="c2 li-bullet-0"><span class="c0">… Question is what scroll updates would require, and that is harder to reason about as a single PerformanceEventTiming entry.</span></li><li class="c2 li-bullet-0"><span class="c0">… We don’t want to expose all scroll updates, so we want some way to aggregate them. It’s not clear how, but they may require different values than EventTiming</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Noam H</b>: Updates are more about smoothness and not responsiveness to an interaction</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Nicol&aacute;s</b>: Right. If we needed to have Scroll Update here then we should have a new entry. &nbsp;If we wanted to have part of it in FrameTiming, then it could be OK to have the same entry for both. Not sure. </span></li><li class="c2 li-bullet-0"><span class="c0"><b>Noam H</b>: Would frame timing include attribution to events</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Nicol&aacute;s</b>: I don’t think so.</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Sean</b>: My understanding scrollBegin is the purple area in the diagram you have showing</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Nicol&aacute;s</b>: It should be the same “next frame presented”</span></li><li class="c2 li-bullet-0"><span class="c0">… For scrollBegin the diagram doesn’t make as much sense as if it doesn’t happen in the JS thread, then there shouldn’t be handlers (green area).</span></li><li class="c2 li-bullet-0"><span class="c0">… On mobile, next frame after the touch move that triggered the scroll</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Sean</b>: The two possible scenarios are whether the JS thread/handlers would be involved?</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Nicol&aacute;s</b>: Correct, in some cases the handlers block scrolling and in that case you need the green part</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Sean</b>: The diagram is bi-modal in that case</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Nicol&aacute;s</b>: We could expose processingStart/End if it’s blocking scrolling</span></li><li class="c2 li-bullet-0"><span class="c0">… If it’s not blocked, they’d both be 0</span></li><li class="c2 li-bullet-0"><span class="c0">… That way developers would know it’s being blocked by handlers</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Peter</b>: Thanks for the presentation, quick question - working with real world cases after Web Vitals goes live.</span></li><li class="c2 li-bullet-0"><span class="c0">… The point where we say work kicked off by event handlers, what I see in some websites is people skip Web Vitals from SEO, by defining loading of third-party snippets until after the user has just scrolled.</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Nicol&aacute;s</b>: If it’s on the scroll event, it would probably not even be captured by the diagram -- async work out of scope of this</span></li><li class="c2 li-bullet-0"><span><b>Annie</b>: If you’re tracking all inputs, and the first input kicks off some work, that work should be captured by the later input events.</span></li></ul></div></div><div id="footer"><span>Published by <a target="_blank" title="Learn more about Google Drive" href="https://docs.google.com/">Google Drive</a></span><span class="dash">–</span><a href="https://docs.google.com/u/0/abuse?id=AKkXjoyp5S7KTX2HejsfCNoRNnqr1MIfcjKKZRtXiyTjPQbI-jJOVeBLt01q8mA4aeH3uV4z9zGFjdP_GI1NFOU:0">Report Abuse</a></div><script type="text/javascript" nonce="">(function(){/*

 Copyright The Closure Library Authors.
 SPDX-License-Identifier: Apache-2.0
*/
var aa="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a};function ba(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;b<a.length;++b){var c=a[b];if(c&&c.Math==Math)return c}throw Error("Cannot find global object");}var ca=ba(this);
function da(a,b){if(b)a:{var c=ca;a=a.split(".");for(var d=0;d<a.length-1;d++){var e=a[d];if(!(e in c))break a;c=c[e]}a=a[a.length-1];d=c[a];b=b(d);b!=d&&null!=b&&aa(c,a,{configurable:!0,writable:!0,value:b})}}var ea="function"==typeof Object.create?Object.create:function(a){function b(){}b.prototype=a;return new b},h;
if("function"==typeof Object.setPrototypeOf)h=Object.setPrototypeOf;else{var fa;a:{var ha={a:!0},ia={};try{ia.__proto__=ha;fa=ia.a;break a}catch(a){}fa=!1}h=fa?function(a,b){a.__proto__=b;if(a.__proto__!==b)throw new TypeError(a+" is not extensible");return a}:null}var ja=h;
function l(a,b){a.prototype=ea(b.prototype);a.prototype.constructor=a;if(ja)ja(a,b);else for(var c in b)if("prototype"!=c)if(Object.defineProperties){var d=Object.getOwnPropertyDescriptor(b,c);d&&Object.defineProperty(a,c,d)}else a[c]=b[c];a.m=b.prototype}da("Object.is",function(a){return a?a:function(b,c){return b===c?0!==b||1/b===1/c:b!==b&&c!==c}});var m=this||self;function ka(){}function la(a){var b=typeof a;return"object"==b&&null!=a||"function"==b}
function ma(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();d.push.apply(d,arguments);return a.apply(this,d)}}function na(a,b){function c(){}c.prototype=b.prototype;a.m=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.A=function(d,e,f){for(var g=Array(arguments.length-2),k=2;k<arguments.length;k++)g[k-2]=arguments[k];return b.prototype[e].apply(d,g)}}function oa(a){return a};var pa=Array.prototype.indexOf?function(a,b){return Array.prototype.indexOf.call(a,b,void 0)}:function(a,b){if("string"===typeof a)return"string"!==typeof b||1!=b.length?-1:a.indexOf(b,0);for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1};function qa(a,b,c){for(var d in a)b.call(c,a[d],d,a)};var p;function q(a,b){this.i=a===ra&&b||"";this.j=sa}q.prototype.h=!0;q.prototype.g=function(){return this.i};var sa={},ra={};var ta=/&/g,ua=/</g,va=/>/g,wa=/"/g,xa=/'/g,ya=/\x00/g,za=/[\x00&<>"']/;function r(a,b){this.i=b===u?a:""}r.prototype.h=!0;r.prototype.g=function(){return this.i.toString()};r.prototype.toString=function(){return this.i.toString()};function v(a){return a instanceof r&&a.constructor===r?a.i:"type_error:SafeUrl"}
var Aa=/^(?:audio\/(?:3gpp2|3gpp|aac|L16|midi|mp3|mp4|mpeg|oga|ogg|opus|x-m4a|x-matroska|x-wav|wav|webm)|font\/\w+|image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp|x-icon)|video\/(?:mpeg|mp4|ogg|webm|quicktime|x-matroska))(?:;\w+=(?:\w+|"[\w;,= ]+"))*$/i,Ba=/^data:(.*);base64,[a-z0-9+\/]+=*$/i,Ca=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;function Da(a){if(a instanceof r)return a;a="object"==typeof a&&a.h?a.g():String(a);Ca.test(a)||(a="about:invalid#zClosurez");return new r(a,u)}
var u={},Ea=new r("about:invalid#zClosurez",u);var w;a:{var Fa=m.navigator;if(Fa){var Ga=Fa.userAgent;if(Ga){w=Ga;break a}}w=""}function x(a){return-1!=w.indexOf(a)};function y(a,b,c){this.i=c===Ha?a:""}y.prototype.h=!0;y.prototype.g=function(){return this.i.toString()};y.prototype.toString=function(){return this.i.toString()};var Ha={};function Ia(a,b,c,d){a=a instanceof r?a:Da(a);b=b||m;c=c instanceof q?c instanceof q&&c.constructor===q&&c.j===sa?c.i:"type_error:Const":c||"";return void 0!==d?b.open(v(a),c,d,void 0):b.open(v(a),c)};function Ja(a){Ja[" "](a);return a}Ja[" "]=ka;function Ka(a,b,c){return Object.prototype.hasOwnProperty.call(a,b)?a[b]:a[b]=c(b)};var La=x("Trident")||x("MSIE"),Ma=x("Edge")||La,Na=x("Gecko")&&!(-1!=w.toLowerCase().indexOf("webkit")&&!x("Edge"))&&!(x("Trident")||x("MSIE"))&&!x("Edge"),Oa=x("Macintosh");function Pa(a){return Ka(a.prototype,"$$generatedClassName",function(){return"Class$obf_"+{valueOf:function(){return++Qa}}})}var Qa=1E3;function z(){}z.prototype.s=function(){return this.j||(Object.defineProperties(this,{j:{value:Ra=Ra+1|0,enumerable:!1}}),this.j)};z.prototype.toString=function(){var a=A(Sa(Ta(this.constructor)))+"@";var b=(this.s()>>>0).toString(16);return a+A(b)};function C(){}l(C,z);C.prototype.i=function(a){this.h=a;if(a instanceof Object)try{a.v=this}catch(b){}};function Ua(a){a.h instanceof Error&&(Error.captureStackTrace?Error.captureStackTrace(a.h):a.h.stack=Error().stack)}C.prototype.toString=function(){var a=Sa(Ta(this.constructor)),b=this.l;return null==b?a:A(a)+": "+A(b)};function Va(){}l(Va,C);function Wa(){}l(Wa,Va);var Ra=0;function D(){}l(D,Wa);D.prototype.i=function(a){Wa.prototype.i.call(this,Object.is(this.g,"__noinit__")?a:this.g)};function Xa(){}l(Xa,D);function Ya(a,b){return"string"==typeof a?a.charCodeAt(b):a.g(b)};function A(a){return null==a?"null":a.toString()}function Za(a){return 65536<=a?A(String.fromCharCode((55296+((a-65536|0)>>10&1023)|0)&65535))+A(String.fromCharCode((56320+((a-65536|0)&1023)|0)&65535)):String.fromCharCode(a&65535)}function $a(a,b){var c=b,d=a.length,e;b=Ya(a,(e=c,c=c+1|0,e));var f;if(e=55296<=b&&56319>=b&&c<d)a=f=Ya(a,c),e=56320<=a&&57343>=a;var g;e?g=65536+((b&1023)<<10)+(f&1023)|0:g=b;return g};function ab(a,b){this.h=a;this.g=b}l(ab,z);function Sa(a){var b=Pa(a.h);0!=a.g&&(b="L"+A(b)+";");a=a.g;for(var c="",d=0;d<a;d=d+1|0)c=A(c)+"[";return A(c)+A(b)}ab.prototype.toString=function(){return"class "+A(Sa(this))};function Ta(a){return Ka(a.prototype,"$$class/0",function(){return new ab(a,0)})};function bb(a,b){return null==a?a:b?decodeURI(a):decodeURIComponent(a)};var cb=/^(?:([^:/?#.]+):)?(?:\/\/(?:([^/?#]*)@)?([^/#?]*?)(?::([0-9]+))?(?=[/#?]|$))?([^?#]+)?(?:\?([^#]*))?(?:#([\S\s]*))?$/;function db(a){a=cb.exec(a);for(var b=[],c=0;7>=c;c=c+1|0)a.length<=c||null==a[c]?b.push(null):b.push(a[c]);return b}
function eb(a,b){var c=a.indexOf(Za(35));c=0>c?a.length:c;a:{var d=0;for(var e=b.length;0<(d=a.indexOf(b,d))&&d<c;){var f=$a(a,d-1|0);if(38==f||63==f){if((d+e|0)>=a.length)break a;f=$a(a,d+e|0);if(61==f||38==f||35==f)break a}d=d+(e+1)|0}d=-1}if(0>d)return null;e=a.indexOf(Za(38),d);if(0>e||e>c)e=c;d=d+(b.length+1)|0;b=Math.min(a.length,d);a=a.substr(b,Math.min(a.length,Math.max(d,e))-b|0);c=" ";for(b=0;0<=(b=c.indexOf("\\",b));)36==c.charCodeAt(b+1|0)?(d=A(c.substr(0,b|0))+"$",e=b=b+1|0,c=d+A(c.substr(e))):
(d=A(c.substr(0,b|0)),e=b=b+1|0,c=d+A(c.substr(e)));a=a.replace(/\+/g,c);return bb(a,!1)};function E(a,b){this.h=b;for(var c=[],d=!0,e=a.length-1;0<=e;e--){var f=a[e]|0;d&&f==b||(c[e]=f,d=!1)}this.g=c}var fb={};function gb(a){return-128<=a&&128>a?Ka(fb,a,function(b){return new E([b|0],0>b?-1:0)}):new E([a|0],0>a?-1:0)}function F(a){if(isNaN(a)||!isFinite(a))return G;if(0>a)return H(F(-a));for(var b=[],c=1,d=0;a>=c;d++)b[d]=a/c|0,c*=4294967296;return new E(b,0)}var G=gb(0),I=gb(1),hb=gb(16777216);
function J(a){if(-1==a.h)return-J(H(a));for(var b=0,c=1,d=0;d<a.g.length;d++){var e=K(a,d);b+=(0<=e?e:4294967296+e)*c;c*=4294967296}return b}E.prototype.toString=function(a){a=a||10;if(2>a||36<a)throw Error("radix out of range: "+a);if(L(this))return"0";if(-1==this.h)return"-"+H(this).toString(a);for(var b=F(Math.pow(a,6)),c=this,d="";;){var e=ib(c,b).g;c=M(c,N(e,b));var f=((0<c.g.length?c.g[0]:c.h)>>>0).toString(a);c=e;if(L(c))return f+d;for(;6>f.length;)f="0"+f;d=f+d}};
function K(a,b){return 0>b?0:b<a.g.length?a.g[b]:a.h}function L(a){if(0!=a.h)return!1;for(var b=0;b<a.g.length;b++)if(0!=a.g[b])return!1;return!0}function O(a,b){a=M(a,b);return-1==a.h?-1:L(a)?0:1}function H(a){for(var b=a.g.length,c=[],d=0;d<b;d++)c[d]=~a.g[d];return(new E(c,~a.h)).add(I)}E.prototype.abs=function(){return-1==this.h?H(this):this};
E.prototype.add=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0,e=0;e<=b;e++){var f=d+(K(this,e)&65535)+(K(a,e)&65535),g=(f>>>16)+(K(this,e)>>>16)+(K(a,e)>>>16);d=g>>>16;f&=65535;g&=65535;c[e]=g<<16|f}return new E(c,c[c.length-1]&-2147483648?-1:0)};function M(a,b){return a.add(H(b))}
function N(a,b){if(L(a)||L(b))return G;if(-1==a.h)return-1==b.h?N(H(a),H(b)):H(N(H(a),b));if(-1==b.h)return H(N(a,H(b)));if(0>O(a,hb)&&0>O(b,hb))return F(J(a)*J(b));for(var c=a.g.length+b.g.length,d=[],e=0;e<2*c;e++)d[e]=0;for(e=0;e<a.g.length;e++)for(var f=0;f<b.g.length;f++){var g=K(a,e)>>>16,k=K(a,e)&65535,t=K(b,f)>>>16,n=K(b,f)&65535;d[2*e+2*f]+=k*n;Q(d,2*e+2*f);d[2*e+2*f+1]+=g*n;Q(d,2*e+2*f+1);d[2*e+2*f+1]+=k*t;Q(d,2*e+2*f+1);d[2*e+2*f+2]+=g*t;Q(d,2*e+2*f+2)}for(e=0;e<c;e++)d[e]=d[2*e+1]<<16|
d[2*e];for(e=c;e<2*c;e++)d[e]=0;return new E(d,0)}function Q(a,b){for(;(a[b]&65535)!=a[b];)a[b+1]+=a[b]>>>16,a[b]&=65535,b++}function R(a,b){this.g=a;this.h=b}
function ib(a,b){if(L(b))throw Error("division by zero");if(L(a))return new R(G,G);if(-1==a.h)return b=ib(H(a),b),new R(H(b.g),H(b.h));if(-1==b.h)return b=ib(a,H(b)),new R(H(b.g),b.h);if(30<a.g.length){if(-1==a.h||-1==b.h)throw Error("slowDivide_ only works with positive integers.");for(var c=I,d=b;0>=O(d,a);)c=S(c,1),d=S(d,1);var e=T(c,1),f=T(d,1);d=T(d,2);for(c=T(c,2);!L(d);){var g=f.add(d);0>=O(g,a)&&(e=e.add(c),f=g);d=T(d,1);c=T(c,1)}b=M(a,N(e,b));return new R(e,b)}for(e=G;0<=O(a,b);){c=Math.max(1,
Math.floor(J(a)/J(b)));d=Math.ceil(Math.log(c)/Math.LN2);d=48>=d?1:Math.pow(2,d-48);f=F(c);for(g=N(f,b);-1==g.h||0<O(g,a);)c-=d,f=F(c),g=N(f,b);L(f)&&(f=I);e=e.add(f);a=M(a,g)}return new R(e,a)}E.prototype.and=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=K(this,d)&K(a,d);return new E(c,this.h&a.h)};E.prototype.or=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=K(this,d)|K(a,d);return new E(c,this.h|a.h)};
E.prototype.xor=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=K(this,d)^K(a,d);return new E(c,this.h^a.h)};function S(a,b){var c=b>>5;b%=32;for(var d=a.g.length+c+(0<b?1:0),e=[],f=0;f<d;f++)e[f]=0<b?K(a,f-c)<<b|K(a,f-c-1)>>>32-b:K(a,f-c);return new E(e,a.h)}function T(a,b){var c=b>>5;b%=32;for(var d=a.g.length-c,e=[],f=0;f<d;f++)e[f]=0<b?K(a,f+c)>>>b|K(a,f+c+1)<<32-b:K(a,f+c);return new E(e,a.h)};M(S(I,32),I);M(S(I,128),I);function jb(a){a&&"function"==typeof a.u&&a.u()};function U(){this.h=this.h;this.g=this.g}U.prototype.h=!1;U.prototype.u=function(){this.h||(this.h=!0,this.j())};U.prototype.j=function(){if(this.g)for(;this.g.length;)this.g.shift()()};var kb=function(){if(!m.addEventListener||!Object.defineProperty)return!1;var a=!1,b=Object.defineProperty({},"passive",{get:function(){a=!0}});try{m.addEventListener("test",ka,b),m.removeEventListener("test",ka,b)}catch(c){}return a}();function lb(a,b){this.type=a;this.target=b;this.defaultPrevented=!1}lb.prototype.g=function(){this.defaultPrevented=!0};function V(a){lb.call(this,a?a.type:"");this.relatedTarget=this.target=null;this.button=this.screenY=this.screenX=this.clientY=this.clientX=0;this.key="";this.metaKey=this.shiftKey=this.altKey=this.ctrlKey=!1;this.state=null;this.pointerId=0;this.pointerType="";this.h=null;if(a){var b=this.type=a.type,c=a.changedTouches&&a.changedTouches.length?a.changedTouches[0]:null;this.target=a.target||a.srcElement;var d=a.relatedTarget;if(d){if(Na){a:{try{Ja(d.nodeName);var e=!0;break a}catch(f){}e=!1}e||(d=
null)}}else"mouseover"==b?d=a.fromElement:"mouseout"==b&&(d=a.toElement);this.relatedTarget=d;c?(this.clientX=void 0!==c.clientX?c.clientX:c.pageX,this.clientY=void 0!==c.clientY?c.clientY:c.pageY,this.screenX=c.screenX||0,this.screenY=c.screenY||0):(this.clientX=void 0!==a.clientX?a.clientX:a.pageX,this.clientY=void 0!==a.clientY?a.clientY:a.pageY,this.screenX=a.screenX||0,this.screenY=a.screenY||0);this.button=a.button;this.key=a.key||"";this.ctrlKey=a.ctrlKey;this.altKey=a.altKey;this.shiftKey=
a.shiftKey;this.metaKey=a.metaKey;this.pointerId=a.pointerId||0;this.pointerType="string"===typeof a.pointerType?a.pointerType:mb[a.pointerType]||"";this.state=a.state;this.h=a;a.defaultPrevented&&V.m.g.call(this)}}na(V,lb);var mb={2:"touch",3:"pen",4:"mouse"};V.prototype.g=function(){V.m.g.call(this);var a=this.h;a.preventDefault?a.preventDefault():a.returnValue=!1};var nb="closure_listenable_"+(1E6*Math.random()|0);var ob=0;function pb(a,b,c,d,e){this.listener=a;this.g=null;this.src=b;this.type=c;this.capture=!!d;this.i=e;this.key=++ob;this.h=this.o=!1}function qb(a){a.h=!0;a.listener=null;a.g=null;a.src=null;a.i=null};function rb(a){this.src=a;this.g={};this.h=0}rb.prototype.add=function(a,b,c,d,e){var f=a.toString();a=this.g[f];a||(a=this.g[f]=[],this.h++);var g;a:{for(g=0;g<a.length;++g){var k=a[g];if(!k.h&&k.listener==b&&k.capture==!!d&&k.i==e)break a}g=-1}-1<g?(b=a[g],c||(b.o=!1)):(b=new pb(b,this.src,f,!!d,e),b.o=c,a.push(b));return b};function sb(a,b){var c=b.type;if(c in a.g){var d=a.g[c],e=pa(d,b),f;(f=0<=e)&&Array.prototype.splice.call(d,e,1);f&&(qb(b),0==a.g[c].length&&(delete a.g[c],a.h--))}};var tb="closure_lm_"+(1E6*Math.random()|0),ub={},vb=0;function wb(a,b,c,d,e){if(d&&d.once)return xb(a,b,c,d,e);if(Array.isArray(b)){for(var f=0;f<b.length;f++)wb(a,b[f],c,d,e);return null}c=yb(c);return a&&a[nb]?a.g.add(String(b),c,!1,la(d)?!!d.capture:!!d,e):zb(a,b,c,!1,d,e)}
function zb(a,b,c,d,e,f){if(!b)throw Error("Invalid event type");var g=la(e)?!!e.capture:!!e,k=Ab(a);k||(a[tb]=k=new rb(a));c=k.add(b,c,d,g,f);if(c.g)return c;d=Bb();c.g=d;d.src=a;d.listener=c;if(a.addEventListener)kb||(e=g),void 0===e&&(e=!1),a.addEventListener(b.toString(),d,e);else if(a.attachEvent)a.attachEvent(Cb(b.toString()),d);else if(a.addListener&&a.removeListener)a.addListener(d);else throw Error("addEventListener and attachEvent are unavailable.");vb++;return c}
function Bb(){function a(c){return b.call(a.src,a.listener,c)}var b=Db;return a}function xb(a,b,c,d,e){if(Array.isArray(b)){for(var f=0;f<b.length;f++)xb(a,b[f],c,d,e);return null}c=yb(c);return a&&a[nb]?a.g.add(String(b),c,!0,la(d)?!!d.capture:!!d,e):zb(a,b,c,!0,d,e)}
function Eb(a){if("number"!==typeof a&&a&&!a.h){var b=a.src;if(b&&b[nb])sb(b.g,a);else{var c=a.type,d=a.g;b.removeEventListener?b.removeEventListener(c,d,a.capture):b.detachEvent?b.detachEvent(Cb(c),d):b.addListener&&b.removeListener&&b.removeListener(d);vb--;(c=Ab(b))?(sb(c,a),0==c.h&&(c.src=null,b[tb]=null)):qb(a)}}}function Cb(a){return a in ub?ub[a]:ub[a]="on"+a}function Db(a,b){if(a.h)a=!0;else{b=new V(b,this);var c=a.listener,d=a.i||a.src;a.o&&Eb(a);a=c.call(d,b)}return a}
function Ab(a){a=a[tb];return a instanceof rb?a:null}var Fb="__closure_events_fn_"+(1E9*Math.random()>>>0);function yb(a){if("function"===typeof a)return a;a[Fb]||(a[Fb]=function(b){return a.handleEvent(b)});return a[Fb]};function W(a){U.call(this);this.l=a;this.i={}}na(W,U);var Gb=[];function Hb(a){qa(a.i,function(b,c){this.i.hasOwnProperty(c)&&Eb(b)},a);a.i={}}W.prototype.j=function(){W.m.j.call(this);Hb(this)};W.prototype.handleEvent=function(){throw Error("EventHandler.handleEvent not implemented");};function Ib(a){U.call(this);this.i=a||document.body;this.l=new W(this);a=ma(jb,this.l);this.h?a():(this.g||(this.g=[]),this.g.push(a));a=this.l;var b=this.i,c=this.s,d="click";Array.isArray(d)||(d&&(Gb[0]=d.toString()),d=Gb);for(var e=0;e<d.length;e++){var f=wb(b,d[e],c||a.handleEvent,!1,a.l||a);if(!f)break;a.i[f.key]=f}}l(Ib,U);
Ib.prototype.s=function(a){if(!(0!=a.h.button||Oa&&a.ctrlKey||a.defaultPrevented))for(var b=a.target;b&&b!=this.i;){if(b.tagName&&"a"==b.tagName.toLowerCase()){var c=b.getAttribute("href")||b.getAttributeNS("http://www.w3.org/1999/xlink","href"),d=c;try{var e=db(c)[3];var f;if(f="www.google.com"===bb(e,!0)){var g=db(c)[5];f="/url"===bb(g,!0)}if(f){var k=eb(c,"q");d=k?k:eb(c,"url")}}catch(B){a:{var t=B;if(null!=t){var n=t.v;if(null!=n){B=n;break a}}if(t instanceof TypeError){var P=n=new Xa;P.l=A(t);
Ua(P);n.g="__noinit__";n.g=t;n.i(new TypeError(n));t=n}else P=n=new D,P.l=A(t),Ua(P),n.g="__noinit__",n.g=t,n.i(Error(n)),t=n;B=t}if(!(B instanceof Va))throw B.h;}d=null!=d?d:"";if(c!=d){e=void 0;b={target:"_blank",noreferrer:!0};c=window;d instanceof r?f=d:(f="undefined"!=typeof d.href?d.href:String(d),f instanceof r||(f="object"==typeof f&&f.h?f.g():String(f),Ca.test(f)?f=new r(f,u):(f=String(f),f=f.replace(/(%0A|%0D)/g,""),f=(g=f.match(Ba))&&Aa.test(g[1])?new r(f,u):null)),f=f||Ea);d=b.target||
d.target;g=[];for(e in b)switch(e){case "width":case "height":case "top":case "left":g.push(e+"="+b[e]);break;case "target":case "noopener":case "noreferrer":break;default:g.push(e+"="+(b[e]?1:0))}e=g.join(",");if((x("iPhone")&&!x("iPod")&&!x("iPad")||x("iPad")||x("iPod"))&&c.navigator&&c.navigator.standalone&&d&&"_self"!=d)e="A",g=document,e=String(e),"application/xhtml+xml"===g.contentType&&(e=e.toLowerCase()),g=e=g.createElement(e),f=f instanceof r?f:Da(f),g.href=v(f),e.setAttribute("target",d),
b.noreferrer&&e.setAttribute("rel","noreferrer"),b=document.createEvent("MouseEvent"),b.initMouseEvent("click",!0,!0,c,1),e.dispatchEvent(b);else if(b.noreferrer){if(c=Ia("",c,d,e),b=v(f),c){Ma&&-1!=b.indexOf(";")&&(b="'"+b.replace(/'/g,"%27")+"'");c.opener=null;za.test(b)&&(-1!=b.indexOf("&")&&(b=b.replace(ta,"&amp;")),-1!=b.indexOf("<")&&(b=b.replace(ua,"&lt;")),-1!=b.indexOf(">")&&(b=b.replace(va,"&gt;")),-1!=b.indexOf('"')&&(b=b.replace(wa,"&quot;")),-1!=b.indexOf("'")&&(b=b.replace(xa,"&#39;")),
-1!=b.indexOf("\x00")&&(b=b.replace(ya,"&#0;")));b='<meta name="referrer" content="no-referrer"><meta http-equiv="refresh" content="0; url='+b+'">';if(void 0===p)if(d=null,(e=m.trustedTypes)&&e.createPolicy){try{d=e.createPolicy("goog#html",{createHTML:oa,createScript:oa,createScriptURL:oa})}catch(B){m.console&&m.console.error(B.message)}p=d}else p=d;b=(d=p)?d.createHTML(b):b;b=new y(b,null,Ha);(c=c.document)&&c.write&&(c.write(b instanceof y&&b.constructor===y?b.i:"type_error:SafeHtml"),c.close())}}else(c=
Ia(f,c,d,e))&&b.noopener&&(c.opener=null);a.g();break}}b=b.parentNode}};function Jb(a){new Ib(a)}var X=["DOCS_installLinkReferrerSanitizer"],Y=m;X[0]in Y||"undefined"==typeof Y.execScript||Y.execScript("var "+X[0]);for(var Z;X.length&&(Z=X.shift());)X.length||void 0===Jb?Y[Z]&&Y[Z]!==Object.prototype[Z]?Y=Y[Z]:Y=Y[Z]={}:Y[Z]=Jb;}).call(this);
</script><script type="text/javascript" nonce="">DOCS_installLinkReferrerSanitizer();</script></body></html>